/**
 * Copyright 2015 ABSir's Studio
 * 
 * All right reserved
 *
 * Create on 2015年9月29日 下午5:02:56
 */
package com.absir.appserv.system.service;

import java.util.HashMap;
import java.util.Map;

import com.absir.appserv.configure.JConfigureUtils;
import com.absir.appserv.system.bean.JPayTrade;
import com.absir.appserv.system.bean.proxy.JiUserBase;
import com.absir.appserv.system.configure.JUcConfigure;
import com.absir.appserv.system.helper.HelperClient;
import com.absir.appserv.system.helper.HelperEncrypt;
import com.absir.appserv.system.helper.HelperJson;
import com.absir.appserv.uc.model.Game;
import com.absir.appserv.uc.model.SidInfoResponse;
import com.absir.bean.core.BeanFactoryUtils;
import com.absir.bean.inject.value.Bean;
import com.absir.core.kernel.KernelCharset;

/**
 * @author absir
 *
 */
@Bean
public class UcService implements IPayInterface, IdentityService {

	/** ME */
	public static final UcService ME = BeanFactoryUtils.get(UcService.class);

	/** UC_CONFIGURE */
	public static final JUcConfigure UC_CONFIGURE = JConfigureUtils.getConfigure(JUcConfigure.class);

	/** PLAT_FORM_NAME */
	public static final String PLAT_FORM_NAME = "UC";

	/**
	 * sdk地址
	 */
	protected String serverUrl = "http://sdk.g.uc.cn/cp/account.verifySession";

	/** debugServerUrl */
	protected String debugServerUrl = "http://sdk.test4.g.uc.cn/cp/account.verifySession";

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.absir.appserv.system.service.IdentityService#getUserBase(java.lang
	 * .String[])
	 */
	@Override
	public JiUserBase getUserBase(String[] parameters) {
		if (parameters.length == 2) {
			String sid = parameters[1];
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("id", System.currentTimeMillis());// 当前系统时间
			//params.put("service", "account.verifySession");

			Game game = new Game();
			game.setCpId(UC_CONFIGURE.getPartnerId());// cpid是在游戏接入时由UC平台分配，同时分配相对应cpId的apiKey
			game.setGameId(UC_CONFIGURE.getGameId());// gameid是在游戏接入时由UC平台分配
			game.setChannelId(UC_CONFIGURE.getChannelId());// channelid是在游戏接入时由UC平台分配
			// serverid是在游戏接入时由UC平台分配，
			// 若存在多个serverid情况，则根据用户选择进入的某一个游戏区而确定。
			// 若在调用该接口时未能获取到具体哪一个serverid，则此时默认serverid=0
			game.setServerId(0);

			params.put("game", game);

			Map<String, Object> data = new HashMap<String, Object>();
			data.put("sid", sid);// 在uc sdk登录成功时，游戏客户端通过uc
									// sdk的api获取到sid，再游戏客户端由传到游戏服务器
			params.put("data", data);

			params.put("encrypt", "md5");
			/*
			 * 签名规则=cpId+签名内容+apiKey
			 * 假定cpId=109,apiKey=202cb962234w4ers2aaa,sid=abcdefg123456
			 * 那么签名原文109sid=abcdefg123456202cb962234w4ers2aaa
			 * 签名结果6e9c3c1e7d99293dfc0c81442f9a9984
			 * sign 的签名规则：MD5(sid=...+apiKey)（去掉+；替换...为实际值）
			 */
			String signSource = "sid=" + sid + UC_CONFIGURE.getMerchantKey();// 组装签名原文
			String sign = HelperEncrypt.encryptionMD5(signSource).toLowerCase();// MD5加密签名

			// System.out.println("[签名原文]" + signSource);
			// System.out.println("[签名结果]" + sign);

			params.put("sign", sign);

			try {
				SidInfoResponse reInfoResponse = HelperClient.openConnection(UC_CONFIGURE.isDebug() ? debugServerUrl : serverUrl,
						true, HelperJson.encode(params).getBytes(KernelCharset.UTF8), SidInfoResponse.class);
				if (reInfoResponse != null && reInfoResponse.getState() != null && reInfoResponse.getState().getCode() == 1) {
					return SecurityService.ME
							.openUserBase(String.valueOf(reInfoResponse.getData().getAccountId()), null, PLAT_FORM_NAME);
				}

			} catch (Exception e) {
			}
		}

		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.absir.appserv.system.service.IPayInterface#validator(com.absir.appserv
	 * .system.bean.JPayTrade)
	 */
	@Override
	public boolean validator(JPayTrade payTrade) throws Exception {
		return false;
	}
}
